{
  "context": {
    "rules": {
      "validators": {
        "dochub": {
          "title": "DocHub"
        },
        "dochub.metamodel": {
          "title": "Контроль ядра метамодели"
        },
        "dochub.metamodel.contexts": {
          "title": "Контроль целостности контекстов"
        },
        "dochub.metamodel.contexts.no_found_component": {
          "title": "Несуществующие компоненты",
          "source": "([(  \n  $MANIFEST := $;\n  contexts.$spread().(                      \n    $CONTEXT_ID := $keys()[0];\n    *.components.\n      {                   \n        \"contextID\": $CONTEXT_ID,\n        \"componentID\": $\n      };\n  )[$ and $not($substring(componentID, -2) = \".*\") and $not($exists($lookup($MANIFEST.components, componentID)))]\n).{\n    \"uid\": \"$dh-mm-nfc-\" & contextID & \"-\" & componentID,\n    \"correction\": \"Определите компонент или удалите ссылку на него в контексте\",\n    \"description\": \"Возможно компонент [\" & componentID & \"] не описан или описан в подключаемой \n    кодовой базе архитектуры, которая сейчас недоступна.\",\n    \"location\": \"/architect/contexts/\" & contextID\n}])\n"
        },
        "dochub.metamodel.contexts.outof": {
          "title": "Компоненты вне контекста",
          "source": "(\n  $MANIFEST := $;\n  $USED := $distinct(contexts.*.components);\n  [components.$spread().(\n      $ID := $keys()[0];\n      {\n          \"id\" : $ID,\n          \"mask\" : $USED[$wcard($ID, $)]\n      }\n  )[$not($exists(mask))].{\n    \"uid\": \"$dh-mm-ofb-\" & id,\n    \"correction\": \"Добавьте компонент в контекст\",\n    \"description\": \"Предполагается, что компонент не включенный в контекст не учтен.\",\n    \"location\": \"/architect/components/\" & id\n  }]\n)\n"
        },
        "dochub.metamodel.components": {
          "title": "Контроль целостности компонентов"
        },
        "dochub.metamodel.components.no_found_aspect": {
          "title": "Аспект не определен",
          "source": "([(  \n  $MANIFEST := $;\n  components.$spread().(                      \n    $COMPONENT_ID := $keys()[0];\n    *.aspects.\n      {                   \n        \"componentID\": $COMPONENT_ID,\n        \"aspectID\": $\n      };\n  )[$ and $not($exists($lookup($MANIFEST.aspects, aspectID)))]\n).{\n    \"uid\": \"$dh-mm-nfa-\" & contextID & \"-\" & componentID,\n    \"correction\": \"Определите аспект или удалите ссылку на него\",\n    \"description\": \"Возможно аспект [\" & aspectID & \"] не описан или описан в подключаемой \n    кодовой базе архитектуры, которая сейчас недоступна.\",\n    \"location\": \"/architect/spects/\" & aspectID\n}])\n"
        },
        "dochub.metamodel.components.no_define_parent": {
          "title": "Компонент верхнего уровня не определен",
          "source": "(\n    $ens := function($id) {\n        (\n            $ids := $split($id, \".\");\n            $join($map($ids, function($v, $i, $a) {\n                    $i < $count($ids) - 1 ? $v : undefined\n            }), \".\")\n        )\n    };\n\n    $MANIFEST := $;\n\n    [[$distinct(components.$spread().(\n        $ens($keys()[0])\n    ))[$not($exists($lookup($MANIFEST.components, $)))]].{\n        \"uid\": \"$dh-mm-cmp-ndp-\" & $,\n        \"correction\": \"Опишите компонент с идентификатором [\" & $ & \"]\",\n        \"description\": \"Предполагается, что для всех уровней компоненты определены.\"\n    }]\n)\n"
        },
        "dochub.metamodel.components.links": {
          "title": "Связь компонентов"
        },
        "dochub.metamodel.components.links.nofound": {
          "title": "Связь с несуществующими компонентами",
          "source": "(\n    $MANIFEST := $;\n    [[components.$spread().(\n        $ID := $keys()[0];\n        $.*.links.{\n            \"ownerID\": $ID,\n            \"linkID\": id\n        }\n    )[$ and $not($exists($lookup($MANIFEST.components, linkID)))]].{\n        \"uid\": \"$dh-mm-cmp-lnk-nf-\" & ownerID & \"-\" & linkID,\n        \"correction\": \"Определите компонент [\" & linkID & \"] или удалите ссылку на него\",\n        \"description\": \"Возможно компонент [\" & linkID & \"] не описан или описан в подключаемой \n        кодовой базе архитектуры, которая сейчас недоступна.\",\n        \"location\": \"/architect/components/\" & ownerID\n    }]\n)\n"
        },
        "dochub.metamodel.aspects": {
          "title": "Контроль целостности аспектов"
        },
        "dochub.metamodel.aspects.no_define_parent": {
          "title": "Аспект верхнего уровня не определен",
          "source": "(\n    $ens := function($id) {\n        (\n            $ids := $split($id, \".\");\n            $join($map($ids, function($v, $i, $a) {\n                    $i < $count($ids) - 1 ? $v : undefined\n            }), \".\")\n        )\n    };\n\n    $MANIFEST := $;\n\n    [[$distinct(aspects.$spread().(\n        $ens($keys()[0])\n    ))[$not($exists($lookup($MANIFEST.aspects, $)))]].{\n        \"uid\": \"$dh-mm-apt-ndp-\" & $,\n        \"correction\": \"Опишите аспект с идентификатором [\" & $ & \"]\",\n        \"description\": \"Предполагается, что для всех уровней аспекты определены.\"\n    }]\n)\n"
        },
        "dochub.fields": {
          "title": "Заполнение полей"
        },
        "dochub.fields.experts": {
          "title": "Не указаны эксперты для компонентов",
          "source": "([([\n  components.$spread().(                                                /* Сканируем все компоненты */\n    $ID := $keys()[0];\n      {                                                                 /* Генерируем массив признаков проблем */\n        \"isComponent\": *.entity = \"component\",                          /* Это компонент */\n        \"isDocHubL1Domain\": $boolean($match($ID, /dochub\\.[^\\.]*$/)),   /* в домене DocHub L1 */\n        \"isExpertEmpty\":  $not($boolean(\"\" & *.expert)),                /* и поле expert не заполнено */\n        \"id\": $ID\n      }\n  )        \n][isDocHubL1Domain and isExpertEmpty and isComponent]).{ /* Отбираем все компоненты где поле 'expert' пустое*/\n    \"uid\": \"expert-component-\" & id,                                    /* Уникальный идентификатор выявленной ошибки */\n    \"location\": \"/architect/components/\" & id,                          /* Ссылка на расположение объекта ошибки */\n    \"correction\": \"Укажите эксперта по компоненту\",                     /* Рекомендации как исправить проблему */\n    \"description\": \"Компоненты L1 должны иметь сведения об экспертах.\"\n}])\n"
        },
        "dochub.fields.source": {
          "title": "Не указан файл исходного кода",
          "schema": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string"
              }
            },
            "required": [
              "source"
            ],
            "additionalProperties": true
          },
          "source": "(\n  /* Создаем валидатор JSON schema */\n  $validator := $jsonschema($self.schema);  /* Схему валидата получаем из контекста отклонения*/\n  /* Формируем базу для проверки */\n  ([([\n    components.$spread().( /* Сканируем все компоненты */\n      $ID := $keys()[0];\n      {\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                    /* Генерируем массив признаков проблем */\n        \"isComponent\": *.entity = \"component\",\t\t\t\t\t\t            /* Это компонент */\n        \"isDocHubDomain\": $boolean($match($ID, /dochub\\.front.*/)),\t  /* в домене DocHub */\n        \"id\": $ID,\t\t\t\t\t\t\t\t\t\t\t\t                            /* Запоминаем идентификатор компонента */\n        \"isvalid\": $validator($.*)\t\t\t\t\t\t\t\t\t                  /* Валидируем компонент по схеме */\t\t\t\t\t\t\t\t\t\n      }\n    )        \n  ][isDocHubDomain and isComponent and isvalid != true]).isvalid.{  /* Генерируем отклонения по выявленным нарушениям */\n    \"uid\": $.params.missingProperty & \"-component-\" & %.id,\t\t\t\t  /* Уникальный идентификатор выявленной ошибки */\n    \"location\": \"/architect/components/\" & %.id,\t\t\t\t\t\t        /* Ссылка на расположение объекта ошибки */\n    \"correction\": \"Заполните необходимые поля\",\t\t\t\t\t\t          /* Рекомендации как исправить проблему */\n    \"description\": message\n  }])\n)\n"
        }
      },
      "exceptions": {
        "source-component-dochub.front.spa.blank.doc.markdown": {
          "reason": "Пример исключения для указания исходных кодов\n",
          "cause": "/docs/dochub.exceptions.examples.doc_markdown"
        },
        "$dh-mm-ofb-dochub": {
          "reason": "Корневой компонент может не входить в контекст"
        }
      }
    },
    "entities": {
      "entities": {
        "schema": {
          "type": "object",
          "additionalProperties": false,
          "patternProperties": {
            "^[a-zA-Z0-9_]*(\\.[a-zA-Z0-9_]*)*$": {
              "title": "Идентификатор сущности",
              "type": "object",
              "properies": {
                "presentations": {
                  "type": "object",
                  "additionalProperties": false,
                  "patternProperties": {
                    "^[a-zA-Z0-9_]*$": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "$doctypes"
                            },
                            "template": {
                              "type": "$file"
                            },
                            "source": {
                              "type": "$jsonata"
                            }
                          },
                          "required": [
                            "type",
                            "template",
                            "source"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "$doctypes"
                            },
                            "source": {
                              "type": "$file"
                            }
                          },
                          "required": [
                            "type",
                            "source"
                          ]
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      },
      "interactions": {
        "title": "Взаимодействия",
        "description": "Взаимодействия между компонентами\n",
        "menu": "(\n  $interactions := $.interactions;\n  $makeLocation := function($id) {(\n      $arrleft := function($arr ,$count) {\n          $map($arr, function($v, $i) {\n          $i <= $count ? $v\n          })\n      };\n      $domains := $split($id, \".\");\n      \"Взаимодействия/\" & $join($map($domains, function($domain, $index) {(\n          $lookup($interactions, $join($arrleft($domains, $index), \".\")).title\n      )}), \"/\");\n  )};\n  $append([{\n      \"icon\": *.icon,                                                 /* Получаем иконку */\n      \"link\": \"/entities/interactions/tree\",                           /* Ссылка на форму представления tree (дерево дерево объектов \"interactions\") */\n      \"location\": \"Взаимодействия\"                                    /* Расположение в меню */\n  }\n  ],\n      [$.interactions.$spread().{\n          \"icon\": *.icon,                                             /* Получаем иконку */\n          \"link\": \"/entities/interactions/blank?id=\" & $keys()[0],     /* Формируем ссылку на бланк документ */\n          \"location\": $makeLocation($keys()[0])                       /* Формируем расположение в меню */\n      }][location]\n  );\n)\n",
        "presentations": {
          "tree": {
            "type": "plantuml",
            "template": "templates/tree.puml",
            "title": "Каталог взаимодействия",
            "params": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                }
              }
            },
            "source": "(\n    $set(\"rpev-id\", undefined);\n    $arrleft := function($arr ,$count) {\n        $map($arr, function($v, $i) {\n            $i <= $count ? $v\n        })\n    };\n    $interactions := $.interactions;\n    [$interactions.$spread().($merge([{\"id\" : $keys()[0]}, $.*]))^(id).(\n        $prev_nodes := $split($get(\"rpev-id\"), \".\");\n        $prev_level := $count($prev_nodes);\n        $curr_nodes := $split(id, \".\");\n        $set(\"isdiff\", false);\n        $result := $map($curr_nodes, function($v, $i) {(\n            $set(\"isdiff\", $get(\"isdiff\") or $prev_level = 0 or $prev_level <= $i or $v != $prev_nodes[$i]) ? (\n                $id := $join($arrleft($curr_nodes, $i), \".\");\n                $interaction :=  $lookup($interactions, $id);\n                {\n                    \"id\": $id,\n                    \"level\": $pad(\"\", $i + 2, \"*\"),\n                    \"title\": ($interaction ? $interaction.title : $id),\n                    \"link\": $id=$params.id ? undefined : \"/entities/interactions/blank?id=\" & $id\n                }\n            );\n        )});\n        $set(\"rpev-id\", id);\n        $result \n    )];\n)  \n"
          },
          "blank": {
            "type": "plantuml",
            "title": "Диаграмма взаимодействия",
            "template": "templates/blank.puml",
            "params": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "id"
              ]
            },
            "source": "(\n    $lookup(interactions, $params.id)\n)\n"
          },
          "export": {
            "type": "upload",
            "mimetype": "application/xml",
            "title": "Экспорт в BPMN",
            "template": "templates/bpmn.xml",
            "params": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "id"
              ]
            },
            "source": "(\n  $mul := 120;\n  $lookup(interactions, $params.id).(\n      $this := $;\n      $body := {\n          \"id\": $params.id,\n          \"start\": {\n              \"name\": $this.triggers[0],\n              \"stepid\": \"step0\",\n              \"outgoing\": \"flow0\",\n              \"shapey\": $mul,\n              \"labely\": $mul - 30\n          },\n          \"steps\": $this.steps ~> $map(function($v, $i) { \n              {\n                  \"name\": $v.value,\n                  \"stepid\": \"step\" & ($i+1),\n                  \"flowid\": \"flow\" & ($i),\n                  \"incoming\": \"flow\" & ($i),\n                  \"outgoing\": \"flow\" & ($i+1),\n                  \"sourceRef\": \"step\" & ($i),\n                  \"targetRef\": \"step\" & ($i+1),\n                  \"shapey\": ($i * $mul) + ($mul * 2),\n                  \"flowy\": ($i * $mul) + ($mul * 2) - ($i = 0 ? 84 : 40),\n                  \"flowdy\": ($i * $mul) + ($mul * 2)\n              }\n          })\n      };\n      $step_count := $count($body.steps);\n      $merge([$body, {\n          \"end\": {\n              \"name\": $this.results[0],\n              \"stepid\": \"step\" & ($step_count + 1),\n              \"flowid\": \"flow\" & ($step_count),\n              \"incoming\": \"flow\" & ($step_count),\n              \"sourceRef\": \"step\" & ($step_count),\n              \"targetRef\": \"step\" & ($step_count+1),\n              \"shapey\": $step_count * $mul + ($mul * 2) + 50,\n              \"labely\": $step_count * $mul - 30 + ($mul * 2) + 50,\n              \"flowy\": ($step_count * $mul) + ($mul * 2 - 40),\n              \"flowdy\": ($step_count * $mul) + ($mul * 2) + 54\n\n          }\n      }])\n  )\n)\n"
          }
        },
        "schema": {
          "type": "object",
          "patternProperties": {
            "[a-zA-Z0-9_]*(\\.[a-zA-Z0-9_]*)*$": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "properties": {
                  "icon": {
                    "title": "Иконка",
                    "type": "string",
                    "minLength": 2
                  },
                  "title": {
                    "title": "Наименование",
                    "type": "string",
                    "minLength": 5
                  },
                  "triggers": {
                    "title": "События запускающие взаимодействие",
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "string",
                      "minLength": 5
                    }
                  },
                  "steps": {
                    "title": "Описание взаимодействия",
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "object",
                      "properties": {
                        "from": {
                          "title": "От кого",
                          "type": "string",
                          "minLength": 1
                        },
                        "to": {
                          "title": "Кому",
                          "type": "string",
                          "minLength": 1
                        },
                        "value": {
                          "title": "Что",
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "from",
                        "to",
                        "value"
                      ]
                    }
                  },
                  "results": {
                    "title": "Результаты взаимодействия",
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "string",
                      "minLength": 5
                    }
                  }
                },
                "required": [
                  "title",
                  "triggers",
                  "results",
                  "steps"
                ]
              }
            }
          }
        }
      },
      "components": {
        "presentations": {
          "blank": {
            "widgets": {
              "outside_links": {
                "title": "Кто зависит от этого компонента",
                "presentation": "outside_links",
                "params": {
                  "param1": "Значение параметра 1",
                  "param2": "Значение параметра 2"
                },
                "align": "<"
              }
            }
          },
          "outside_links": {
            "params": {
              "type": "object",
              "properties": {
                "component": {
                  "title": "Идентификатор компонента",
                  "type": "string"
                },
                "param1": {
                  "title": "Обязательный параметр 1",
                  "type": "string"
                }
              },
              "required": [
                "component"
              ]
            },
            "type": "table",
            "headers": [
              {
                "value": "id",
                "text": "Идентификатор",
                "sortable": true,
                "align": "left",
                "width": "40%",
                "link": "link"
              },
              {
                "value": "title",
                "text": "Наименование",
                "sortable": true,
                "align": "left",
                "width": "40%",
                "link": "link"
              },
              {
                "value": "direction",
                "text": "Направление связи",
                "sortable": true,
                "align": "center",
                "width": "20%"
              }
            ],
            "source": "(\n  [$distinct(components.$spread().(\n    $id := $keys()[0];\n    $title := *.title;\n    $links := $distinct($.*.links[id=$params.component].(\"\" & direction));\n    $links.{\n      \"id\": $id,\n      \"title\": $title,\n      \"direction\": $links,\n      \"link\": \"/architect/components/\" & $id\n    }\n  ))^(id)]\n)\t\n"
          }
        }
      },
      "aspects": {
        "presentations": {
          "blank": {
            "widgets": {
              "people": {
                "title": "Люди",
                "presentation": "people",
                "align": "<"
              }
            }
          },
          "people": {
            "params": {
              "type": "object",
              "properties": {
                "aspect": {
                  "title": "Идентификатор аспекта",
                  "type": "string"
                }
              },
              "required": [
                "aspect"
              ]
            },
            "type": "markdown",
            "template": "templates/people.md",
            "source": "(\n  $lookup(aspects, $params.aspect)\n)\t          \n"
          }
        }
      }
    },
    "imports": [
      "interactions/entity.yaml",
      "extentions/entity.yaml",
      "order.yaml",
      "payment.yaml",
      "context.yaml",
      "front.yaml",
      "plantuml.yaml",
      "user.yaml",
      "gitlab.yaml",
      "browser.yaml",
      "web.yaml",
      "examples/root.yaml",
      "components/root.yaml",
      "aspects.yaml",
      "contexts.yaml",
      "namespaces.yaml",
      "forms.yaml",
      "technologies.yaml",
      "rules.yaml",
      "examples/table.yaml",
      "rules/root.yaml",
      "plugins/root.yaml",
      "conception/root.yaml",
      "manual/root.yaml",
      "docs/root.yaml",
      "arch/root.yaml",
      "entities/root.yaml",
      "/documentation/root.yaml"
    ],
    "docs": {
      "dochub.welcome": {
        "type": "markdown",
        "source": "introduction.md"
      },
      "dochub.conception": {
        "location": "DocHub",
        "description": "Концепция",
        "type": "markdown",
        "source": "introduction.md"
      },
      "dochub.conception.introduction": {
        "description": "Введение",
        "type": "markdown",
        "source": "introduction.md"
      },
      "dochub.mindmap": {
        "description": "Карта памяти",
        "type": "PlantUML",
        "source": "mindmap.puml"
      },
      "dochub.archver": {
        "description": "Управление версиями",
        "type": "PlantUML",
        "source": "archver.puml"
      },
      "dochub.archdistrib": {
        "description": "Распределенная архитектура",
        "type": "PlantUML",
        "source": "archdistrib.puml"
      },
      "dochub.archeco": {
        "description": "Структура экосистем",
        "type": "PlantUML",
        "source": "archeco.puml"
      },
      "dochub.archeco.proc": {
        "description": "Управление архитектурой экосистем",
        "type": "PlantUML",
        "source": "archeco_proc.puml"
      },
      "dochub.facade": {
        "description": "Управление архитектурными фасадами",
        "type": "PlantUML",
        "source": "facade.puml"
      },
      "dochub.manual": {
        "location": "DocHub/Руководство",
        "description": "Руководство",
        "type": "markdown",
        "source": "introduction.md",
        "subjects": [
          "dochub",
          "dochub.front"
        ]
      },
      "dochub.introduction": {
        "location": "DocHub/Руководство/Введение",
        "description": "Введение",
        "type": "markdown",
        "subjects": [
          "dochub",
          "dochub.front"
        ],
        "source": "introduction.md"
      },
      "dochub.imports": {
        "location": "DocHub/Руководство/Импорт",
        "description": "Импорт манифестов",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa"
        ],
        "source": "imports.md"
      },
      "dochub.components": {
        "location": "DocHub/Руководство/Компоненты",
        "description": "Компоненты",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.component"
        ],
        "source": "components.md"
      },
      "dochub.contexts": {
        "location": "DocHub/Руководство/Контексты",
        "description": "Контексты",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.context"
        ],
        "source": "contexts.md"
      },
      "dochub.aspects": {
        "location": "DocHub/Руководство/Аспекты",
        "description": "Аспекты",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.aspect"
        ],
        "source": "aspects.md"
      },
      "dochub.forms": {
        "location": "DocHub/Руководство/Формы",
        "description": "Формы",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa"
        ],
        "source": "forms.md"
      },
      "dochub.technologies": {
        "location": "DocHub/Руководство/Технологии",
        "description": "Технологии",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa"
        ],
        "source": "technologies.md"
      },
      "dochub.radar": {
        "location": "DocHub/Руководство/Техрадар",
        "description": "Техрадар",
        "type": "markdown",
        "subjects": [
          "dochub.radar",
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.radar"
        ],
        "source": "radar.md"
      },
      "dochub.datasets": {
        "location": "DocHub/Руководство/Источники данных",
        "description": "Источники данных",
        "type": "markdown",
        "source": "datasets.md",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.dataset"
        ]
      },
      "dochub.inheritance": {
        "location": "DocHub/Руководство/Наследование",
        "description": "Наследование объектов",
        "type": "markdown",
        "source": "inheritance.md",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.dataset"
        ]
      },
      "dochub.jsonata": {
        "location": "DocHub/Руководство/JSONata+",
        "description": "Расширения JSONata",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.dataset"
        ],
        "source": "jsonata.md"
      },
      "dochub.entities": {
        "location": "DocHub/Руководство/Сущности",
        "description": "Расширения метамодели",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.dataset"
        ],
        "source": "entities/intro.md"
      },
      "dochub.entities.examples": {
        "location": "DocHub/Руководство/Сущности/Пример",
        "description": "Пример расширения метамодели",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.dataset"
        ],
        "source": "entities/entities.md"
      },
      "dochub.deployment": {
        "icon": "settings",
        "location": "DocHub/Развертывание",
        "description": "Развертывание",
        "type": "markdown",
        "subjects": [
          "dochub.front"
        ],
        "source": "config/deployment.md"
      },
      "dochub.context.source": {
        "type": "plantuml",
        "source": "context_source.puml"
      },
      "dochub.docs": {
        "location": "DocHub/Руководство/Документы",
        "description": "Документы",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "docs.md"
      },
      "dochub.markdown": {
        "location": "DocHub/Руководство/Документы/Markdown",
        "description": "Markdown",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "markdown.md"
      },
      "dochub.plantuml": {
        "location": "DocHub/Руководство/Документы/PlantUML",
        "description": "PlantUML",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "plantuml.md"
      },
      "dochub.mermaid": {
        "location": "DocHub/Руководство/Документы/Mermaid",
        "description": "Mermaid",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "mermaid.md"
      },
      "dochub.network": {
        "location": "DocHub/Руководство/Документы/Network",
        "description": "Network",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "network.md"
      },
      "dochub.asyncapi": {
        "location": "DocHub/Руководство/Документы/AsyncApi",
        "description": "Markdown",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "asyncapi.md"
      },
      "dochub.swagger": {
        "location": "DocHub/Руководство/Документы/Swagger",
        "description": "Swagger",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "swagger.md"
      },
      "dochub.tables": {
        "location": "DocHub/Руководство/Документы/Таблицы",
        "description": "Таблицы",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "tables.md"
      },
      "dochub.smartants": {
        "location": "DocHub/Руководство/Документы/SmartAnts",
        "description": "SmartAnts",
        "autor": "R.Piontik",
        "type": "markdown",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "smartants.md"
      },
      "dochub.smartants.examples.simple": {
        "location": "DocHub/Руководство/Документы/SmartAnts/01 Простой пример",
        "description": "Простой пример использования SmartAnts",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": {
          "config": {
            "distance": 120,
            "trackWidth": 24
          },
          "nodes": {
            "system": {
              "title": "Система",
              "symbol": "system"
            },
            "user": {
              "title": "Пользователь",
              "symbol": "user"
            }
          },
          "links": [
            {
              "from": "user",
              "to": "system",
              "title": "Логин и пароль",
              "style": "->",
              "link": "/docs/dochub.plantuml"
            },
            {
              "from": "system",
              "to": "user",
              "title": "JWT токен",
              "style": "->",
              "link": "/docs/dochub.swagger"
            }
          ]
        }
      },
      "dochub.smartants.examples.domains": {
        "location": "DocHub/Руководство/Документы/SmartAnts/02 Домены",
        "description": "Пример диаграммы SmartAnts с доменами",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": {
          "config": {
            "distance": 120,
            "trackWidth": 24
          },
          "nodes": {
            "inside": {
              "title": "Внутренняя среда"
            },
            "outside": {
              "title": "Внешняя среда"
            },
            "inside.system": {
              "title": "Система",
              "symbol": "system"
            },
            "outside.user": {
              "title": "Пользователь",
              "symbol": "user"
            }
          },
          "links": [
            {
              "from": "outside.user",
              "to": "inside.system",
              "title": "Логин и пароль",
              "style": "->"
            },
            {
              "from": "inside.system",
              "to": "outside.user",
              "title": "JWT токен",
              "style": "->"
            }
          ]
        }
      },
      "dochub.smartants.examples.complex": {
        "location": "DocHub/Руководство/Документы/SmartAnts/03 Сложная диаграмма",
        "description": "Сложная диаграмма SmartAnts",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": "examples/sa-complex.yaml"
      },
      "dochub.smartants.examples.anim": {
        "location": "DocHub/Руководство/Документы/SmartAnts/04 Анимация",
        "description": "Анимированная диаграмма SmartAnts",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": "examples/sa-anim.yaml"
      },
      "dochub.smartants.examples.custom-symbol": {
        "location": "DocHub/Руководство/Документы/SmartAnts/05 Собственные символы",
        "description": "Кастомные символы SmartAnts",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": "examples/sa-symbol.yaml"
      },
      "dochub.smartants.examples.simple-query": {
        "location": "DocHub/Руководство/Документы/SmartAnts/06 Простой запрос к данным",
        "description": "Простой запрос к данным в SmartAnts",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": "(\n  /* Определяем фильтр для компонентов архитектуры */\n  $matcher := /^[a-zA-Z]*\\.[a-zA-Z]*$/i;\n  /* Генерируем структуру для диаграммы */\n  {\n    /* Формируем ноды из компонентов */\n    \"nodes\": $merge(components.$spread().(\n      /* Получаем идентификатор компонента */\n      $id := $keys()[0];\n      /* Если идентификатор компонента удовлетворяет фильтру, создаем ноду */\n      $matcher($id) ? {\n          /* Отсекаем домен верхнего уровня для исключения отображения компонентов в иерархии */\n          $split($id, \".\")[1]: {\n              \"title\": *.title,\n              /* Преобразуем entity компонентов в понятные диаграмме символы actor -> user */\n              \"symbol\": *.entity = \"actor\" ? \"user\" : *.entity\n          }\n      }\n\n    ))\n  }\n)\n"
      },
      "dochub.smartants.examples.complex-query": {
        "location": "DocHub/Руководство/Документы/SmartAnts/07 Сложный запрос к данным",
        "description": "Сложный запрос к данным в SmartAnts",
        "autor": "R.Piontik",
        "type": "smartants",
        "source": "examples/sa-query.jsonata"
      },
      "dochub.example.pml": {
        "type": "PlantUML",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "examples/example.puml"
      },
      "dochub.example.mermaid": {
        "type": "Mermaid",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "examples/mermaid.mmd"
      },
      "dochub.example.network": {
        "type": "Network",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "(\n  $manifest := $;\n  /* Перебираем все компоненты */\n  $adges  := $distinct(components.$spread().(\n    $node_id := $keys()[0];\n    $node := $.*;\n    /* Определяем связи */\n    $node.links.{\n      \"from\": $node_id,\n      \"to\": id,\n      \"label\": title\n    }\n  ));\n  /* Выявляем ноды из связей */\n  $nodes := $distinct($append($adges.from, $adges.to)).(\n    $struct := $split($, \".\");\n    $group := $replace($, \".\" & $reverse($struct)[0], \"\");\n    {\n      \"id\": $,\n      \"label\": $lookup($manifest.components, $).title,\n      \"group\": $group,\n      \"level\": $count($struct),\n      /* Позиционируем ноду тем выше, чем выше слой */\n      \"y\": $count($struct) * 200\n    }\n  );\n  /* Добавляем ноды легенды */\n  $nodes := $append($nodes, (\n    /* Получаем максимальную точку позиции нод */\n    $height := $max($nodes.y);\n    $groups := $distinct($nodes.group)^($);\n    /* Вычисляем центр легенды */\n    $offset := -($height / 2);\n    /* Определяем шаг легенды */\n    $step := $height / $count($groups);\n    /* Строим легенду */\n    $map($groups, function($v, $i, $a) {\n      {\n        \"id\": \"legend-\" & $string($i),\n        \"x\": -600,\n        \"y\": $i * $step + $offset,\n        \"shape\": \"square\",\n        \"label\": $v,\n        \"group\": $v,\n        \"value\": 1,\n        \"fixed\": true,\n        \"physics\": false\n      }\n    })\n  ));\n  /* Выводим результат */\n  {\n    \"nodes\": $nodes, /* Массив нод */\n    \"edges\": $adges, /* Массив связей */\n    \"options\": {     /* Параметры сетевой диаграммы https://visjs.github.io/vis-network/docs/network/ */\n      \"clickToUse\": false /* Отключаем обязательный клик перед взаимодействем с пользователем */\n    }\n  }\n)\n"
      },
      "dochub.example.swgr": {
        "type": "OpenAPI",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "examples/example.yaml"
      },
      "dochub.example.asyncapi": {
        "type": "AsyncApi",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "source": "examples/asyncapi.yaml"
      },
      "dochub.templates": {
        "location": "DocHub/Руководство/Документы/Шаблоны",
        "description": "Шаблоны",
        "type": "markdown",
        "autor": "R.Piontik",
        "approvers": [
          "P.Petrov",
          "S.Sidorov",
          "N.Nikolaev"
        ],
        "source": "(\n  {\n    \"id\": $self._id,              /* Идентификатор документа */\n    \"autor\": $self.autor,         /* Автор документа */\n    \"approvers\": $self.approvers, /* Согласующие */\n    \"docs\": [docs.$spread().{     /* Другие документы автора */\n      \"id\": $keys()[0],\n      \"title\": *.description,\n      \"autor\": *.autor\n    }][autor=$self.autor]\n  }\n)\n",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "template": "templates.md"
      },
      "dochub.templates.pml": {
        "type": "PlantUML",
        "source": "(\n  {\n    \"entities\": $distinct([     /* Получаем все использованные сущности при описании архитектуры */ \n        components.*.entity\n    ])\n  }\n)\n",
        "subjects": [
          "dochub.front",
          "dochub.front.spa",
          "dochub.front.spa.blank",
          "dochub.front.spa.blank.doc"
        ],
        "template": "examples/template.puml"
      },
      "dochub.templates.asyncapi": {
        "type": "AsyncAPI",
        "source": "(\n  $BODY := $mergedeep([components.*.asyncapi]);\n  {\n      \"content\": [$BODY.$spread().{\n          \"field\": $keys()[0],\n          \"body\": $string($lookup($, $keys()[0]))\n      }]\n  }\n)\n",
        "template": "examples/asyncapi_template.json"
      },
      "dochub.templates.openapi": {
        "type": "OpenAPI",
        "source": "(\n  $BODY := $mergedeep([components.*.openapi]);\n  {\n      \"content\": [$BODY.$spread().{\n          \"field\": $keys()[0],\n          \"body\": $string($lookup($, $keys()[0]))\n      }]\n  }\n)\n",
        "template": "examples/openapi_template.json"
      },
      "dochub.table.preset": {
        "type": "table",
        "headers": [
          {
            "value": "id",
            "text": "Идентификатор",
            "sortable": true,
            "align": "left",
            "width": "20%"
          },
          {
            "value": "payload",
            "text": "Значение",
            "sortable": true,
            "align": "left"
          }
        ],
        "source": [
          {
            "id": 1,
            "payload": "Значение 1"
          },
          {
            "id": 2,
            "payload": "Значение 2"
          }
        ]
      },
      "dochub.table.select": {
        "type": "table",
        "headers": [
          {
            "value": "from",
            "text": "Система 1",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link-from"
          },
          {
            "value": "to",
            "text": "Система 2",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link-to"
          },
          {
            "value": "direction",
            "text": "Связь",
            "sortable": true,
            "align": "center",
            "width": "5%"
          },
          {
            "value": "title",
            "text": "Описание",
            "sortable": true,
            "align": "left"
          },
          {
            "value": "contract",
            "text": "Контракт",
            "sortable": true,
            "align": "left",
            "link": "link-contract"
          }
        ],
        "source": "(\n  $MANIFEST := $;\n  $distinct([components.$spread().(\n      $COMPONENT := $;\n      $COMPONENT_ID := $keys()[0];\n      $.*.links.{\n          \"from\": $COMPONENT.*.title,\n          \"link-from\": \"/architect/components/\" & $COMPONENT_ID,\n          \"to\": id ? $lookup($MANIFEST.components, id).title : id,\n          \"link-to\": \"/architect/components/\" & id,\n          \"contract\": contract ? $lookup($MANIFEST.docs, contract).location : contract,\n          \"link-contract\": \"/docs/\" & contract,\n          \"title\": title,\n          \"direction\": direction\n      };\n  )])^(from)\n)\n"
      },
      "dochub.table.ex_jsonata": {
        "type": "table",
        "headers": [
          {
            "value": "id",
            "text": "Идентификатор",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link"
          },
          {
            "value": "title",
            "text": "Наименование",
            "sortable": true,
            "align": "left",
            "link": "link"
          }
        ],
        "source": "contexts.jsonata"
      },
      "dochub.table.ex_yaml": {
        "type": "table",
        "headers": [
          {
            "value": "name",
            "text": "ФИО автора",
            "sortable": true,
            "align": "left",
            "width": "100%"
          }
        ],
        "source": "autors.yaml"
      },
      "dochub.table.ex_http": {
        "type": "table",
        "headers": [
          {
            "value": "title",
            "text": "Name",
            "sortable": true,
            "align": "left"
          }
        ],
        "origin": "https://labs.ft.com/tech-radar/demo.json",
        "source": "showcases.jsonata"
      },
      "dochub.table.dataset": {
        "type": "table",
        "headers": [
          {
            "value": "location",
            "text": "Документ",
            "sortable": true,
            "align": "left",
            "width": "100%",
            "link": "link"
          }
        ],
        "source": "dochub.docs"
      },
      "dochub.table.dataset.post": {
        "type": "table",
        "headers": [
          {
            "value": "title",
            "text": "Документ",
            "sortable": true,
            "align": "left",
            "width": "100%",
            "link": "link"
          }
        ],
        "origin": "dochub.docs",
        "source": "(\n  $[$substring(location, 0, 29) = \"DocHub/Руководство/Документы/\"].{\n    \"title\": $substring(location, 29),\n    \"link\": link\n  }\n)\n"
      },
      "dochub.dataset.preset": {
        "type": "table",
        "headers": [
          {
            "value": "title",
            "text": "Класс критичности",
            "sortable": true,
            "align": "left",
            "width": "100%"
          }
        ],
        "source": "dochub.components.criticality"
      },
      "dochub.dataset.li": {
        "type": "table",
        "headers": [
          {
            "value": "location",
            "text": "Компонент L1",
            "sortable": true,
            "align": "left",
            "width": "100%",
            "link": "link"
          }
        ],
        "source": "dochub.components.l1"
      },
      "dochub.table.integrations": {
        "type": "table",
        "headers": [
          {
            "value": "from",
            "text": "Система 1",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link-from"
          },
          {
            "value": "to",
            "text": "Система 2",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link-to"
          },
          {
            "value": "direction",
            "text": "Связь",
            "sortable": true,
            "align": "center",
            "width": "5%"
          },
          {
            "value": "title",
            "text": "Описание",
            "sortable": true,
            "align": "left"
          },
          {
            "value": "contract",
            "text": "Контракт",
            "sortable": true,
            "align": "left",
            "link": "link-contract"
          }
        ]
      },
      "dochub.table.integrations.vuex": {
        "type": "table",
        "headers": [
          {
            "value": "from",
            "text": "Система 1",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link-from"
          },
          {
            "value": "to",
            "text": "Система 2",
            "sortable": true,
            "align": "left",
            "width": "20%",
            "link": "link-to"
          },
          {
            "value": "direction",
            "text": "Связь",
            "sortable": true,
            "align": "center",
            "width": "5%"
          },
          {
            "value": "title",
            "text": "Описание",
            "sortable": true,
            "align": "left"
          },
          {
            "value": "contract",
            "text": "Контракт",
            "sortable": true,
            "align": "left",
            "link": "link-contract"
          }
        ],
        "source": "(\n    $[from=\"VUEX\" or to=\"VUEX\"]\n)\n",
        "$prototype": "dochub.table.select",
        "origin": "dochub.integrations"
      },
      "dochub.rules": {
        "location": "DocHub/Руководство/Правила",
        "description": "Подсистема контроля",
        "type": "markdown",
        "source": "rules.md",
        "subjects": [
          "dochub"
        ]
      },
      "dochub.rules.validators": {
        "location": "DocHub/Руководство/Правила/Валидаторы",
        "description": "Валидаторы",
        "type": "markdown",
        "source": "validators.md",
        "subjects": [
          "dochub"
        ]
      },
      "dochub.rules.exceptions": {
        "location": "DocHub/Руководство/Правила/Исключения",
        "description": "Исключения",
        "type": "markdown",
        "source": "exceptions.md",
        "subjects": [
          "dochub"
        ]
      },
      "dochub.standards.examples.expert": {
        "description": "Пример стандарта",
        "type": "markdown",
        "source": "standard.md"
      },
      "dochub.exceptions.examples.doc_markdown": {
        "description": "Пример основания для исключения",
        "type": "markdown",
        "source": "exreason.md"
      },
      "dochub.plugins.intro": {
        "location": "DocHub/Руководство/Плагины",
        "type": "markdown",
        "source": "introduction.md"
      },
      "dochub.plugins.interface": {
        "location": "DocHub/Руководство/Плагины/Интерфейсы ядра",
        "type": "markdown",
        "source": "interface.md"
      },
      "dochub.plugins.example": {
        "location": "DocHub/Руководство/Плагины/Пример",
        "type": "html",
        "headers": {
          "head1": {
            "type": "test"
          }
        },
        "source": "examples/example.html"
      }
    },
    "datasets": {
      "dochub.docs": {
        "source": "(\n  [docs.$spread().{\n    \"location\": *.location,\n    \"link\": \"/docs/\" & $keys()[0]\n  }[location]^(location)]\n)\n"
      },
      "dochub.components.criticality": {
        "source": [
          {
            "id": "k1",
            "title": "Уровень K1"
          },
          {
            "id": "k2",
            "title": "Уровень K2"
          },
          {
            "id": "k3",
            "title": "Уровень K3"
          },
          {
            "id": "k4",
            "title": "Уровень K4"
          }
        ]
      },
      "dochub.components": {
        "source": "(\n  [components.$spread().{\n      \"id\": $keys()[0],\n      \"location\": *.title,\n      \"link\": \"/architect/components/\" & $keys()[0]\n  }[$substring(id, 0, 7)=\"dochub.\"]^(title)]\n)\n"
      },
      "dochub.components.l1": {
        "origin": "dochub.components",
        "source": "($[$count($split(id, \".\"))=2])\n"
      },
      "dochub.integrations": {
        "source": "(\n  $MANIFEST := $;\n  $distinct([components.$spread().(\n      $COMPONENT := $;\n      $COMPONENT_ID := $keys()[0];\n      $.*.links.{\n          \"from\": $COMPONENT.*.title,\n          \"link-from\": \"/architect/components/\" & $COMPONENT_ID,\n          \"to\": id ? $lookup($MANIFEST.components, id).title : id,\n          \"link-to\": \"/architect/components/\" & id,\n          \"contract\": contract ? $lookup($MANIFEST.docs, contract).location : contract,\n          \"link-contract\": \"/docs/\" & contract,\n          \"title\": title,\n          \"direction\": direction\n      };\n  )])^(from)\n)\n"
      },
      "dochub.plugins.example": {
        "origin": "dochub.components",
        "source": "examples/test.jsonata"
      }
    },
    "components": {
      "dochub": {
        "title": "DocHub"
      },
      "dochub.front": {
        "title": "DocHub",
        "entity": "component",
        "source": "./",
        "expert": "R.Piontik",
        "technologies": [
          "JavaScript",
          "VUEJS2",
          "Chrome",
          "Firefox",
          "Safari"
        ],
        "aspects": [
          "dochub.gitlab.auth",
          "dochub.manifest.parsing",
          "dochub.contexts",
          "dochub.aspects",
          "dochub.docs",
          "dochub.radar",
          "dochub.navigation",
          "dochub.dataset"
        ],
        "links": [
          {
            "id": "dochub.gitlab",
            "direction": "<--",
            "title": "Манифесты и документы"
          },
          {
            "id": "dochub.plantuml",
            "direction": "-->",
            "title": "PlantUML"
          },
          {
            "id": "dochub.plantuml",
            "direction": "<-",
            "title": "Схема SVG"
          },
          {
            "id": "dochub.web",
            "direction": "<--",
            "title": "Манифесты и документы"
          }
        ]
      },
      "dochub.front.spa": {
        "title": "SPA приложение DocHub",
        "entity": "component",
        "source": "./src/frontend/main.js",
        "technologies": [
          "JavaScript",
          "VUEJS2",
          "Chrome",
          "Firefox",
          "Safari"
        ],
        "aspects": [
          "dochub.gitlab.auth",
          "dochub.manifest.parsing",
          "dochub.contexts",
          "dochub.aspects",
          "dochub.docs",
          "dochub.navigation",
          "dochub.radar",
          "dochub.dataset"
        ],
        "links": [
          {
            "id": "dochub.browser.localstorage",
            "title": "Кэш манифестов, cookies",
            "direction": "<-->"
          },
          {
            "id": "dochub.gitlab.api",
            "direction": "<--",
            "title": "Манифесты, документы"
          },
          {
            "id": "dochub.gitlab.oauth",
            "direction": "-->",
            "title": "Авторизация GitLab"
          },
          {
            "id": "dochub.gitlab.oauth",
            "direction": "<--",
            "title": "Токен авторизации"
          },
          {
            "id": "dochub.web",
            "direction": "<---",
            "title": "Манифесты, документы"
          },
          {
            "id": "dochub.plantuml.jar",
            "direction": "->",
            "title": "PlantUML"
          },
          {
            "id": "dochub.plantuml.jar",
            "direction": "<-",
            "title": "SVG"
          }
        ]
      },
      "dochub.front.spa.user_interface": {
        "title": "Интерфейс пользователя",
        "entity": "actor",
        "source": "./src/components/Root.vue",
        "technologies": [
          "JavaScript",
          "VUE2"
        ],
        "links": [
          {
            "id": "dochub.front.spa.router",
            "direction": "<-->"
          }
        ]
      },
      "dochub.front.spa.vue2": {
        "title": "VUE2",
        "entity": "component",
        "source": "./src/frontend/main.js",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.router": {
        "title": "VUE Router",
        "entity": "component",
        "source": "./src/router/index.js",
        "links": [
          {
            "id": "dochub.front.spa.vue2"
          }
        ]
      },
      "dochub.front.spa.vuex": {
        "title": "VUEX",
        "entity": "component",
        "source": "./src/storage/gitlab.js",
        "technologies": [
          "JavaScript",
          "VUE2",
          "VUEX"
        ]
      },
      "dochub.front.spa.menu": {
        "title": "DocHub меню",
        "entity": "component",
        "source": "./src/components/Menu.vue",
        "technologies": [
          "JavaScript",
          "VUE2"
        ],
        "links": [
          {
            "id": "dochub.front.spa.router",
            "title": "Представление",
            "direction": "-->"
          },
          {
            "id": "dochub.front.spa.jsonata",
            "title": "Меню",
            "direction": "<--"
          }
        ]
      },
      "dochub.front.spa.workspace": {
        "title": "Рабочая область",
        "entity": "component",
        "source": "./src/router/index.js",
        "technologies": [
          "JavaScript",
          "VUE2"
        ],
        "links": [
          {
            "id": "dochub.front.spa.router",
            "title": "Представление",
            "direction": "-->"
          }
        ]
      },
      "dochub.front.spa.jsonata": {
        "title": "JSONata",
        "entity": "component",
        "source": "./src/manifest/query.js",
        "technologies": [
          "JavaScript",
          "VUE2"
        ],
        "links": [
          {
            "id": "dochub.front.spa.vuex",
            "title": "Комплексный манифест",
            "direction": "<--"
          }
        ]
      },
      "dochub.front.spa.manifest_parser": {
        "title": "Manifest parser",
        "entity": "component",
        "source": "./src/manifest/manifest_parser.js",
        "technologies": [
          "JavaScript",
          "VUE2",
          "Axios"
        ],
        "links": [
          {
            "id": "dochub.front.spa.vuex",
            "title": "Комплексный манифест",
            "direction": "-->"
          },
          {
            "id": "dochub.front.spa.manifest_data",
            "direction": "<--"
          }
        ]
      },
      "dochub.front.spa.manifest_data": {
        "title": "Данные манифеста",
        "entity": "interface",
        "technologies": [
          "Axios"
        ]
      },
      "dochub.front.spa.blank": {
        "title": "Карточка объекта",
        "entity": "component",
        "source": "./src/Architecture/*",
        "technologies": [
          "JavaScript",
          "VUE2"
        ],
        "links": [
          {
            "id": "dochub.front.spa.workspace",
            "title": "Представление",
            "direction": "-->"
          },
          {
            "id": "dochub.front.spa.jsonata",
            "title": "Сводка, размещение и т.п.",
            "direction": "<--"
          },
          {
            "id": "dochub.front.spa.dataset",
            "title": "Данные",
            "direction": "<--"
          }
        ]
      },
      "dochub.front.spa.blank.radar": {
        "title": "Тех. радар",
        "entity": "component",
        "source": "./src/Techradar/*",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.blank.aspect": {
        "title": "Карточка аспекта",
        "entity": "component",
        "source": "./src/Architecture/Aspect.vue",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.blank.component": {
        "title": "Карточка компонента",
        "entity": "component",
        "source": "./src/Architecture/Component.vue",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.blank.context": {
        "title": "Карточка контекста",
        "entity": "component",
        "source": "./src/Architecture/Context.vue",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.blank.doc": {
        "title": "Карточка документа",
        "entity": "component",
        "source": "./src/Docs/*",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.blank.doc.markdown": {
        "title": "Markdown",
        "entity": "component",
        "technologies": [
          "JavaScript",
          "VUE2",
          "Markdown"
        ]
      },
      "dochub.front.spa.blank.doc.asyncapi": {
        "title": "AsyncApi",
        "entity": "component",
        "source": "./src/Docs/DocAsyncApi.vue",
        "technologies": [
          "JavaScript",
          "VUE2",
          "Markdown"
        ]
      },
      "dochub.front.spa.blank.doc.swagger": {
        "title": "Swagger",
        "entity": "component",
        "source": "./src/Docs/DocSwagger.vue",
        "technologies": [
          "JavaScript",
          "VUE2",
          "Markdown"
        ]
      },
      "dochub.front.spa.blank.doc.table": {
        "title": "Таблицы",
        "entity": "component",
        "source": "./src/Docs/DocTable.vue",
        "technologies": [
          "JavaScript",
          "VUE2"
        ]
      },
      "dochub.front.spa.dataset": {
        "title": "Источники данных",
        "entity": "component",
        "source": "./src/helpers/datasets.js",
        "technologies": [
          "JavaScript",
          "VUE2",
          "JSONata"
        ],
        "links": [
          {
            "id": "dochub.front.spa.vuex",
            "title": "Данные"
          },
          {
            "id": "dochub.front.spa.dataset_http",
            "title": "Данные",
            "direction": "<-"
          }
        ]
      },
      "dochub.front.spa.dataset_http": {
        "title": "Внешние данные",
        "entity": "interface",
        "technologies": [
          "Axios"
        ]
      },
      "dochub.plantuml": {
        "title": "PlantUML render server",
        "entity": "component",
        "expert": "R.Piontik",
        "technologies": [
          "PluntUML"
        ],
        "aspects": [
          "dochub.umlrender"
        ]
      },
      "dochub.plantuml.jar": {
        "title": "plantuml.jar",
        "entity": "component",
        "technologies": [
          "PluntUML"
        ],
        "aspects": [
          "dochub.umlrender"
        ],
        "links": [
          {
            "id": "dochub.plantuml.dot",
            "direction": "<-->"
          }
        ]
      },
      "dochub.plantuml.dot": {
        "title": "Graphviz",
        "entity": "component",
        "technologies": [
          "graphviz"
        ]
      },
      "dochub.user": {
        "title": "Пользователь",
        "entity": "actor",
        "links": [
          {
            "id": "dochub.front",
            "direction": "<--",
            "title": "Просмотр"
          }
        ]
      },
      "dochub.gitlab": {
        "title": "GitLab",
        "entity": "component",
        "expert": "R.Piontik",
        "technologies": [
          "GitLab"
        ],
        "aspects": [
          "dochub.gitlab.auth",
          "dochub.manifest.storage"
        ],
        "links": [
          {
            "id": "dochub.user",
            "direction": "<--",
            "title": "Развитие архитектуры"
          }
        ]
      },
      "dochub.gitlab.api": {
        "title": "GitLab API",
        "entity": "component",
        "technologies": [
          "GitLab"
        ],
        "links": [
          {
            "id": "dochub.gitlab.repository",
            "direction": "<--",
            "title": "Файлы манифестов, документы"
          }
        ]
      },
      "dochub.gitlab.repository": {
        "title": "Репозиторий",
        "entity": "database",
        "aspects": [
          "dochub.manifest.storage"
        ]
      },
      "dochub.gitlab.oauth": {
        "title": "GitLab Авторизация",
        "entity": "component",
        "aspects": [
          "dochub.gitlab.auth"
        ],
        "technologies": [
          "GitLab"
        ]
      },
      "dochub.gitlab.gitclient": {
        "title": "git client",
        "entity": "component",
        "technologies": [
          "Git"
        ],
        "aspects": [
          "dochub.git.client"
        ],
        "links": [
          {
            "id": "dochub.gitlab.api",
            "direction": "<-l->",
            "title": "Развитие"
          }
        ]
      },
      "dochub.browser": {
        "title": "Браузер",
        "entity": "component",
        "technologies": [
          "Chrome",
          "Firefox",
          "Safari"
        ]
      },
      "dochub.browser.localstorage": {
        "title": "LocalStorage",
        "entity": "database",
        "technologies": [
          "Chrome",
          "Firefox",
          "Safari"
        ],
        "aspects": [
          "dochub.manifest.storage"
        ]
      },
      "dochub.web": {
        "title": "WEB",
        "entity": "component",
        "expert": "R.Piontik",
        "technologies": [
          "HTTP"
        ],
        "aspects": [
          "dochub.manifest.storage"
        ]
      },
      "dochub.examples": {
        "title": "Примеры"
      },
      "dochub.examples.orders": {
        "title": "Сервис управления заказами",
        "entity": "component",
        "technologies": [
          "PHP"
        ],
        "asyncapi": {
          "servers": {
            "orders": {
              "url": "mqtt://order.host.net",
              "protocol": "mqtt",
              "description": "Orders gateway"
            }
          },
          "channels": {
            "order/create": {
              "subscribe": {
                "operationId": "emitOrderCreate",
                "message": {
                  "$ref": "#/components/messages/OrderCreate"
                }
              }
            }
          },
          "components": {
            "messages": {
              "OrderCreate": {
                "name": "orderCreate",
                "title": "Создание заказа",
                "contentType": "application/json",
                "payload": {
                  "$ref": "#/components/schemas/order"
                }
              }
            },
            "schemas": {
              "order": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "customer": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "curr": {
                    "type": "string",
                    "description": "Валюта"
                  },
                  "value": {
                    "type": "number",
                    "description": "Сумма"
                  },
                  "createdAt": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Момент создания"
                  }
                }
              }
            }
          }
        },
        "openapi": {
          "paths": {
            "/orders": {
              "get": {
                "summary": "Получение списка заказов",
                "responses": {
                  "200": {
                    "content": {
                      "application/json": {
                        "schema": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "format": "uid"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "dochub.examples.payment": {
        "title": "Сервис оплаты",
        "entity": "component",
        "expert": "R.Piontik",
        "technologies": [
          "SberPay",
          "Go"
        ],
        "asyncapi": {
          "servers": {
            "payments": {
              "url": "mqtt://pay.host.net",
              "protocol": "mqtt",
              "description": "Payment gateway"
            }
          },
          "channels": {
            "pay/payment": {
              "subscribe": {
                "operationId": "emitPayment",
                "message": {
                  "$ref": "#/components/messages/Payment"
                }
              }
            }
          },
          "components": {
            "messages": {
              "Payment": {
                "name": "payment",
                "title": "Оплата",
                "summary": "Сообщение по оплате",
                "contentType": "application/json",
                "payload": {
                  "$ref": "#/components/schemas/payment"
                }
              }
            },
            "schemas": {
              "payment": {
                "type": "object",
                "properties": {
                  "account": {
                    "type": "string",
                    "description": "Номер счета"
                  },
                  "curr": {
                    "type": "string",
                    "description": "Валюта"
                  },
                  "value": {
                    "type": "number",
                    "description": "Сумма"
                  },
                  "createdAt": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Момент создания"
                  }
                }
              }
            }
          }
        },
        "openapi": {
          "paths": {
            "/payments": {
              "get": {
                "summary": "Получение списка счетов",
                "responses": {
                  "200": {
                    "content": {
                      "application/json": {
                        "schema": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "format": "uid"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "contexts": {
      "dochub.example": {
        "title": "Контектс-пример",
        "components": [
          "dochub.examples.orders",
          "dochub.examples.payment"
        ]
      },
      "dochub": {
        "title": "Общая архитектура DocHub",
        "location": "DocHub",
        "components": [
          "dochub.front",
          "dochub.user",
          "dochub.plantuml",
          "dochub.gitlab",
          "dochub.web"
        ]
      },
      "dochub.front": {
        "title": "Контейнерная архитектура DocHub",
        "location": "DocHub/Контейнерная архитектура",
        "components": [
          "dochub.browser.*",
          "dochub.front.*",
          "dochub.gitlab.*",
          "dochub.plantuml.*",
          "dochub.web"
        ]
      },
      "dochub.front.spa": {
        "title": "Компонентная архитектура DocHub",
        "location": "DocHub/Компонентная архитектура",
        "components": [
          "dochub.front.spa.*"
        ]
      },
      "dochub.custom": {
        "title": "Компоненты эксперта R.Piontik",
        "location": "DocHub/Контекст по источнику",
        "extra-links": false,
        "source": "(               \n    $ ~> | $ | {\n        \"components\": $merge(components.$spread().(\n            $.*.expert = 'R.Piontik' ? $ : {}\n        )) \n    } |\n)\n",
        "components": [
          "dochub.*"
        ]
      },
      "dochub.front.spa.blank": {
        "title": "Карточка объекта",
        "components": [
          "dochub.front.spa.blank.*"
        ]
      },
      "dochub.front.spa.blank.doc": {
        "title": "Документ",
        "components": [
          "dochub.front.spa.blank.doc.*"
        ]
      },
      "dochub.sequence": {
        "title": "Диаграмма взаимодействия DocHub",
        "icon": "settings_ethernet",
        "location": "DocHub/Диаграмма взаимодействия",
        "uml": "../docs/sequence.puml"
      }
    },
    "aspects": {
      "dochub": {
        "title": "DocHub",
        "location": "DocHub",
        "prodact": "Буренин Ольгерт Юрьевич",
        "analyst": "Семенов Руслан Вазгенович",
        "curator": "Кучменко Татьяна Вадимовна"
      },
      "dochub.git": {
        "title": "Git",
        "location": "DocHub/Git"
      },
      "dochub.git.test.pest.kwest": {
        "title": "Git",
        "location": "DocHub/Git"
      },
      "dochub.git.client": {
        "title": "Развитие репы",
        "location": "DocHub/GitLab/Git-клиент"
      },
      "dochub.gitlab": {
        "title": "GitLab",
        "location": "DocHub/GitLab"
      },
      "dochub.gitlab.auth": {
        "title": "Авторизация GitLab",
        "location": "DocHub/GitLab/Авторизация"
      },
      "dochub.umlrender": {
        "title": "Рендеринг PlantUML",
        "location": "DocHub/Рендеринг/PlantUML"
      },
      "dochub.contexts": {
        "title": "Рендеринг контекстов",
        "location": "DocHub/Рендеринг/Контексты"
      },
      "dochub.aspects": {
        "title": "Рендеринг аспектов",
        "location": "DocHub/Рендеринг/Аспекты"
      },
      "dochub.docs": {
        "title": "Рендеринг документов",
        "location": "DocHub/Рендеринг/Документы"
      },
      "dochub.navigation": {
        "title": "Навигация по архитектуре",
        "location": "DocHub/Навигация по архитектуре"
      },
      "dochub.radar": {
        "title": "Технологический радар",
        "location": "DocHub/Технологический радар"
      },
      "dochub.cache": {
        "title": "Кэш данных",
        "location": "DocHub/Кэш"
      },
      "dochub.manifest": {
        "title": "Манифесты",
        "location": "DocHub/Манифесты"
      },
      "dochub.manifest.storage": {
        "title": "Хранилище манифестов",
        "location": "DocHub/Манифесты/Хранилище манифестов"
      },
      "dochub.manifest.parsing": {
        "title": "Парсинг манифестов",
        "location": "DocHub/Манифесты/Парсинг манифестов"
      },
      "dochub.dataset": {
        "title": "Источники данных",
        "location": "DocHub/Источники данных"
      }
    },
    "namespaces": {
      "dochub": {
        "title": "DocHub"
      },
      "gitlab": {
        "title": "GitLab"
      },
      "git": {
        "title": "Клиент git"
      },
      "manifest": {
        "title": "Манифесты"
      },
      "plantuml": {
        "title": "PlantUML сервер"
      },
      "web": {
        "title": "WEB-ресурсы"
      }
    },
    "forms": [
      {
        "entity": [
          "component"
        ],
        "fields": {
          "source": {
            "title": "Файл",
            "required": true
          }
        }
      }
    ],
    "technologies": {
      "sections": {
        "language": {
          "title": "Языки программирования"
        },
        "parsers": {
          "title": "Парсеры"
        },
        "tools": {
          "title": "Инструментарий"
        },
        "storages": {
          "title": "Хранилища"
        },
        "browsers": {
          "title": "Браузеры"
        }
      },
      "items": {
        "JavaScript": {
          "aliases": [
            "js",
            "NodeJS"
          ],
          "title": "Супер-крутой язык программирования",
          "link": "https://ru.wikipedia.org/wiki/JavaScript",
          "section": "language",
          "status": "adopt"
        },
        "Chrome": {
          "aliases": [
            "Firefox",
            "Safari"
          ],
          "section": "browsers",
          "status": "adopt"
        },
        "VUEJS2": {
          "aliases": [
            "VUE",
            "VUE2"
          ],
          "section": "tools",
          "status": "adopt"
        },
        "VUEX": {
          "section": "tools",
          "status": "adopt"
        },
        "Axios": {
          "section": "tools",
          "status": "adopt"
        },
        "Git": {
          "section": "tools",
          "status": "adopt"
        },
        "Markdown": {
          "section": "parsers",
          "status": "adopt"
        },
        "Swagger": {
          "section": "parsers",
          "status": "adopt"
        },
        "PluntUML": {
          "section": "parsers",
          "status": "adopt"
        },
        "GitLab": {
          "section": "storages",
          "status": "adopt"
        },
        "HTTP": {
          "section": "storages",
          "status": "adopt"
        }
      }
    },
    "interactions": {
      "dochub": {
        "title": "DocHub"
      },
      "dochub.user": {
        "title": "Взаимодействия с пользователем",
        "triggers": [
          "Просмотр архитектуры"
        ],
        "steps": [
          {
            "from": "User",
            "to": "DocHub",
            "value": "Вход на портал"
          },
          {
            "from": "DocHub",
            "to": "User",
            "value": "Представление архитектурных артефактов"
          }
        ],
        "results": [
          "Информация о существующей архитектуре"
        ]
      },
      "dochub.user.check": {
        "title": "Прверка отклонений выявленных валидаторами",
        "triggers": [
          "Просмотр архитектуры"
        ],
        "steps": [
          {
            "from": "User",
            "to": "DocHub",
            "value": "Выбор раздела Проблемы"
          },
          {
            "from": "DocHub",
            "to": "User",
            "value": "Генерация дерева со статусами"
          },
          {
            "from": "User",
            "to": "DocHub",
            "value": "Выбор отклонения"
          },
          {
            "from": "DocHub",
            "to": "User",
            "value": "Карточка отклонения"
          }
        ],
        "results": [
          "Информация об отклонениях"
        ]
      },
      "dochub.user.research": {
        "title": "Изучение документации",
        "triggers": [
          "Просмотр документов"
        ],
        "steps": [
          {
            "from": "User",
            "to": "DocHub",
            "value": "Выбор раздела Документы"
          },
          {
            "from": "DocHub",
            "to": "User",
            "value": "Представление"
          }
        ],
        "results": [
          "Актуальная информация из документов"
        ]
      }
    }
  },
  "data": "(\n  /* Создаем валидатор JSON schema */\n  $validator := $jsonschema($self.schema);  /* Схему валидата получаем из контекста отклонения*/\n  /* Формируем базу для проверки */\n  ([([\n    components.$spread().( /* Сканируем все компоненты */\n      $ID := $keys()[0];\n      {\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                    /* Генерируем массив признаков проблем */\n        \"isComponent\": *.entity = \"component\",\t\t\t\t\t\t            /* Это компонент */\n        \"isDocHubDomain\": $boolean($match($ID, /dochub\\.front.*/)),\t  /* в домене DocHub */\n        \"id\": $ID,\t\t\t\t\t\t\t\t\t\t\t\t                            /* Запоминаем идентификатор компонента */\n        \"isvalid\": $validator($.*)\t\t\t\t\t\t\t\t\t                  /* Валидируем компонент по схеме */\t\t\t\t\t\t\t\t\t\n      }\n    )        \n  ][isDocHubDomain and isComponent and isvalid != true]).isvalid.{  /* Генерируем отклонения по выявленным нарушениям */\n    \"uid\": $.params.missingProperty & \"-component-\" & %.id,\t\t\t\t  /* Уникальный идентификатор выявленной ошибки */\n    \"location\": \"/architect/components/\" & %.id,\t\t\t\t\t\t        /* Ссылка на расположение объекта ошибки */\n    \"correction\": \"Заполните необходимые поля\",\t\t\t\t\t\t          /* Рекомендации как исправить проблему */\n    \"description\": message\n  }])\n)\n",
  "subject": {
    "_id": "dochub.fields.source",
    "title": "Не указан файл исходного кода",
    "schema": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string"
        }
      },
      "required": [
        "source"
      ],
      "additionalProperties": true
    },
    "source": "(\n  /* Создаем валидатор JSON schema */\n  $validator := $jsonschema($self.schema);  /* Схему валидата получаем из контекста отклонения*/\n  /* Формируем базу для проверки */\n  ([([\n    components.$spread().( /* Сканируем все компоненты */\n      $ID := $keys()[0];\n      {\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                    /* Генерируем массив признаков проблем */\n        \"isComponent\": *.entity = \"component\",\t\t\t\t\t\t            /* Это компонент */\n        \"isDocHubDomain\": $boolean($match($ID, /dochub\\.front.*/)),\t  /* в домене DocHub */\n        \"id\": $ID,\t\t\t\t\t\t\t\t\t\t\t\t                            /* Запоминаем идентификатор компонента */\n        \"isvalid\": $validator($.*)\t\t\t\t\t\t\t\t\t                  /* Валидируем компонент по схеме */\t\t\t\t\t\t\t\t\t\n      }\n    )        \n  ][isDocHubDomain and isComponent and isvalid != true]).isvalid.{  /* Генерируем отклонения по выявленным нарушениям */\n    \"uid\": $.params.missingProperty & \"-component-\" & %.id,\t\t\t\t  /* Уникальный идентификатор выявленной ошибки */\n    \"location\": \"/architect/components/\" & %.id,\t\t\t\t\t\t        /* Ссылка на расположение объекта ошибки */\n    \"correction\": \"Заполните необходимые поля\",\t\t\t\t\t\t          /* Рекомендации как исправить проблему */\n    \"description\": message\n  }])\n)\n"
  }
}
